package support;


import com.bugstack.springframework.beans.factory.config.BeanDefinition;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

import java.lang.reflect.Constructor;

abstract class CglibSubclassingInstantiationStrategy implements InstantiationStrategy {


     @Override
     public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) {

         //创建 Enhancer 对象，CGLIB 的核心类，用于创建子类
         Enhancer enhancer = new Enhancer();

         //设置要创建子类的父类
         enhancer.setSuperclass(beanDefinition.getBeanClass());

         //设置回调对象，这里使用 NoOp 回调，它什么也不做
         enhancer.setCallback(new NoOp() {
             @Override
             public int hashCode() {
                 return super.hashCode();
             }
         });

         //如果构造函数为 null，则使用无参构造函数创建子类实例
         if(null == ctor){
             return enhancer.create();
         }

         //// 否则，使用指定的构造函数和参数创建子类实例
         return enhancer.create(ctor.getParameterTypes(),args);

     }
 }
